package demo8

import (
	"fmt"
	"sync/atomic"
)

var (
	// 序列号
	seq int64
)

// 序列号生成器
func genID() int64 {
	// 尝试原子的增加序列号

	// 1. 故意报错 error
	// atomic.AddInt64(&seq, 1)
	// return seq

	// 2. 正确操作
	return atomic.AddInt64(&seq, 1)
}

// TestDemo815 原子访问（atomic包）
func TestDemo815() {
	// 生成 10 个并发序列号
	for i := 0; i < 10; i++ {
		go genID()
	}

	fmt.Println(genID())
}

/*
	tips:
		1. 在运行程序时，为运行参数加入-race参数，开启运行时（runtime）对竞态问题的分析:
			go run -race racedetect.go
		2. 本例中只是对变量进行增减操作，虽然可以使用互斥锁（sync.Mutex）解决竞态问题，但是对性能消耗较大。
			在这种情况下，推荐使用原子操作（atomic）进行变量操作。
*/
